// groupnpc.txt
// Exactly like basicnpc, with one difference. When it first spots a foe, sends
// an alert message to everyone in its group. Good for when you have a band of 
// monsters you don't want the party to be able to pick off one at a time.
// Memory Cells:
//   Cell 0 - How creature moves.
//     0 - If 0, wander randomly. 
//     1 - Stands still until a target appears.
//     2 - Completely immobile, even if target appears.
//   Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this 
//     is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when
//     creature is killed, sets SDF(3,5) to 1.)
//   Cell 3 - Dialogue node to start with if talked to. if left at 0, this
//     character doesn't talk.
//   Cell 4 - Group creature is in.  (You don't need to set this, but it
//     makes life a bit easier.  Leave it at 0 to do nothing.)
//   Cell 5,6 - SDF to increment.
//   Cell 7 - Amount to increment by.

begincreaturescript;

variables;

short i,target;
short i_gave_alert = 0;
short in_fire,last_abil_time,which_atk,trgt,firedmg,mctx,mcty,rctx,rcty;
short redct,redctx,redcty,count;
short bmessage;

body;

beginstate INIT_STATE;
	if (get_memory_cell(0) == 2)
		set_mobility(ME,0);
	if (get_memory_cell(4) > 0)
		add_char_to_group(my_number(),get_memory_cell(4));
	break;

beginstate DEAD_STATE;

	reset_dialog();
	add_dialog_str(0,"Profanus Pyre seems to be wearing out.",0);
	add_dialog_str(1,"_No!  Damn you!  I will not lose!  I will not die!_",0);
	add_dialog_str(2,"Suddenly, he begins convulsing and the horns on his mask begin to climb up his helmet as if they were viscous tendrils.  His mask becomes darker, and a seam begins to weave its way in the middle of his robe.",0);
	add_dialog_str(3,"_I...  WILL...  NOT...  DIE!_",0);
	add_dialog_choice(0,"...?");
	bmessage = run_dialog(1);

	erase_char(6);
	activate_hidden_group(2);
	relocate_character(7,20,13);
	set_character_pose(7,1);
	force_instant_terrain_redraw();
	play_sound(152);
	pause(5);

	set_character_pose(7,0);
	force_instant_terrain_redraw();
	pause(2);

	reset_dialog();
	if(party_size() > 1)
		add_dialog_str(0,"_COME, YOU LOWLIVES!  BARE YOUR WORST!_",0);
	if(party_size() == 1)
		add_dialog_str(0,"_COME, YOU LOWLIFE!  BARE YOUR WORST!_",0);
	add_dialog_choice(0,"Uh-oh.");

	set_character_pose(7,1);
	print_str_color("Profanus Pyre casts Fumarole.",3);
	force_instant_terrain_redraw();
	play_sound(167);
	pause(2);

	rctx = 12;
	while(rctx <= 22){
		rcty = 10;
		while(rcty <= 16){
			set_floor(rctx,rcty,86);
			if(get_ran(1,0,1) == 1)
				put_boom_on_space(rctx,rcty, get_ran(1,0,1),0);

			rcty = (rcty + 1);
		}

		rctx = (rctx + 1);
	}
	force_instant_terrain_redraw();
	run_animation_sound(152);
	pause(4);

	set_character_pose(7,0);
	force_instant_terrain_redraw();
	pause(2);

break;

beginstate START_STATE; 

	if(tick_difference(last_abil_time,get_current_tick()) >= 1){
		mctx = char_loc_x(my_number());
		mcty = char_loc_y(my_number());
		which_atk = get_ran(1,0,9);

		// INNER FIRE
		if(((get_health(my_number()) * 2) <= get_max_health(my_number())) && (in_fire == 0)){
			print_str_color("Profanus Pyre casts Inner Fire.",3);
			set_character_pose(my_number(),1);
			force_instant_terrain_redraw();
			pause(2);

			play_sound(25);
			change_char_health(my_number(),-100);
			if(get_health(my_number()) <= 0){
				print_str("Spell fails!");
				last_abil_time = get_current_tick();
				end();
			}
			play_sound(28);

			alter_stat(my_number(),8,20);
			alter_stat(my_number(),9,20);
			print_str("Profanus Pyre becomes more resilient!");

			in_fire = 1;
			which_atk = 10;
		}

		// FIREBLAST MkII
		if(which_atk <= 3){
			print_str_color("Profanus Pyre casts Fireblast MkII.",1);
			set_character_pose(my_number(),1);
			force_instant_terrain_redraw();
			pause(2);

			play_sound(25);
			change_char_health(my_number(),-50);
			if(get_health(my_number()) <= 0){
				print_str("Spell fails!");
				last_abil_time = get_current_tick();
				end();
			}

			trgt = 0;
			while(trgt <= 119){
				if(((char_ok(trgt) == TRUE) && (char_attitude_to_char(my_number(),trgt) == 2)) && (can_see_char(trgt) == TRUE)){
					rctx = char_loc_x(trgt);
					rcty = char_loc_y(trgt);
					put_straight_zap(mctx,mcty,rctx, rcty,0);
					put_boom_on_space(rctx,rcty,0,0);
					put_effect_on_space(rctx,rcty,9,4, 2);
					run_animation_sound(51);
					firedmg = get_ran(1,100,200);
					if(rctx < mctx)
						redctx = (mctx - rctx);
					if(rctx > mctx)
						redctx = (rctx - mctx);
					redctx = (redctx - 1);
					if(rcty < mcty)
						redcty = (mcty - rcty);
					if(rcty > mcty)
						redcty = (rcty - mcty);
					redcty = (redcty - 1);
					redct = (redctx + redcty);
					redct = (redct * 5);
					firedmg = (firedmg - redct);

					damage_char(trgt,firedmg,1);
				}

				trgt = (trgt + 1);
			}
		}

		// NAPALM
		if((which_atk >= 4) && (which_atk <= 6)){
			print_str_color("Profanus Pyre casts Napalm.",2);
			set_character_pose(my_number(),1);
			force_instant_terrain_redraw();
			pause(2);

			play_sound(25);
			change_char_health(my_number(),-100);
			if(get_health(my_number()) <= 0){
				print_str("Spell fails!");
				last_abil_time = get_current_tick();
				end();
			}

			count = 0;
			trgt = get_ran(1,0,3);
			while((count <= 3) && (which_atk < 10)){
				if(char_ok(trgt) == TRUE){
					if(get_health(trgt) < 75){
						which_atk = 10;
					}
				}

				if(which_atk < 10){
					count = (count + 1);
					trgt = (trgt + 1);
					if(trgt > 3)
						trgt = 0;
				}
			}

			if(which_atk < 10){
				trgt = get_ran(1,0,119);
				count = 0;
			}
			while((count <= 119) && (which_atk < 10)){
				if(((char_ok(trgt) == TRUE) && (char_attitude_to_char(my_number(),trgt) == 2)) && (can_see_char(trgt) == TRUE)){
					which_atk = 10;
				}
				if(which_atk < 10){
					count = (count + 1);
					trgt = (trgt + 1);
					if(trgt >= 120)
						trgt = 0;
				}
			}
			if(which_atk < 10){
				last_abil_time = get_current_tick();
				end();
			}

			rctx = char_loc_x(trgt);
			rcty = char_loc_y(trgt);
			put_boom_on_space(rctx,rcty,1,8);
			put_boom_on_space(rctx,rcty,1,8);
			put_boom_on_space(rctx,rcty,1,8);
			put_boom_on_space(rctx,rcty,1,8);
			put_effect_on_space(rctx,rcty,1,4,2);
			play_sound(169);
			run_animation_sound(152);
			firedmg = get_char_status(trgt,2);
			if(firedmg > 0)
				set_char_status(trgt,2,(firedmg * -1),0,0);
			firedmg = get_char_status(trgt,4);
			if(firedmg > 0)
				set_char_status(trgt,4,(firedmg * -1),1,0);
			firedmg = get_char_status(trgt,5);
			if(firedmg > 0)
				set_char_status(trgt,5,(firedmg * -1),1,0);
			firedmg = get_char_status(trgt,15);
			if(firedmg > 0)
				set_char_status(trgt,15,(firedmg * -1),1,0);
			firedmg = get_char_status(trgt,16);
			if(firedmg > 0)
				set_char_status(trgt,16,(firedmg * -1),1,0);
			firedmg = get_char_status(trgt,17);
			if(firedmg > 0)
				set_char_status(trgt,17,(firedmg * -1),1,0);
			firedmg = get_char_status(trgt,29);
			if(firedmg > 0)
				set_char_status(trgt,29,(firedmg * -1),1,0);
			firedmg = get_ran(1,50,75);
			if(rctx < mctx)
				redctx = (mctx - rctx);
			if(rctx > mctx)
				redctx = (rctx - mctx);
			redctx = (redctx - 1);
			if(rcty < mcty)
				redcty = (mcty - rcty);
			if(rcty > mcty)
				redcty = (rcty - mcty);
			redcty = (redcty - 1);
			redct = (redctx + redcty);
			redct = (redct * 4);
			firedmg = (firedmg - redct);
			damage_char(trgt,firedmg,4);
			damage_near_loc(rctx,rcty,get_ran(1,50,100),1,1);
			status_near_loc(rctx,rcty,(get_ran(1,8,12) * -1),1,1);
			status_near_loc(rctx,rcty,(get_ran(1,8,12) * -1),1,3);
		}

		// ARCANE FIRE
		if((which_atk >= 7) && (which_atk <= 9)){
			print_str_color("Profanus Pyre casts Arcane Fire.",4);
			set_character_pose(my_number(),1);
			force_instant_terrain_redraw();
			pause(2);

			play_sound(163);
			change_char_health(my_number(),-75);
			if(get_health(my_number()) <= 0){
				print_str("Spell fails!");
				last_abil_time = get_current_tick();
				end();
			}

			trgt = 0;
			while(trgt <= 119){
				if(((char_ok(trgt) == TRUE) && (char_attitude_to_char(my_number(),trgt) == 2)) && (can_see_char(trgt) == TRUE)){
					rctx = char_loc_x(trgt);
					rcty = char_loc_y(trgt);
					put_effect_on_space(rctx,rcty,4,6, 1);
					run_animation_sound(167);
					firedmg = (get_level(trgt) * 8);
					if(rctx < mctx)
						redctx = (mctx - rctx);
					if(rctx > mctx)
						redctx = (rctx - mctx);
					redctx = (redctx - 1);
					if(rcty < mcty)
						redcty = (mcty - rcty);
					if(rcty > mcty)
						redcty = (rcty - mcty);
					redcty = (redcty - 1);
					redct = (redctx + redcty);
					redct = (redct * 4);
					firedmg = (firedmg - redct);
					firedmg = (firedmg - (2 * get_stat(trgt,2)));
					firedmg = (firedmg - (4 * get_stat(trgt,11)));
					firedmg = (firedmg - (4 * get_stat(trgt,12)));
					firedmg = (firedmg - (4 * get_stat(trgt,25)));

					damage_char(trgt,firedmg,1);
				}

				trgt = (trgt + 1);
			}
		}

		if((in_fire == 0) || (get_ran(1,0,3) < 3))
			last_abil_time = get_current_tick();
	}

break;

beginstate TALKING_STATE;
	if (get_memory_cell(3) == 0) {
		print_str("Talking: It doesn't respond.");
		end();
		}
	begin_talk_mode(get_memory_cell(3));
break;